/**
 * Trabajo de Ingeniería de Software 2
 * Año 2008
 * Sistema de Reserva de Recursos.
 * Desarrolladores: - Marcelo Ferreira.
 *                  - Christian Gómez.
 *                  - Marcelo Rodas.
 */
package controller;

import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.faces.application.FacesMessage;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.faces.FacesException;
import java.util.HashMap;
import javax.faces.validator.ValidatorException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import javax.transaction.UserTransaction;
import modelo.Estadosolicitud;
import modelo.Solicitudreserva;
import modelo.Solicitudusuario;

/**
 * Controlador de las Funcionalidades del Estado Solicitud.
 * Utilizado para manejar la capa de controlador (MVC)
 * del sistema.
 * @author jmferreira
 * @version 1.0
 */
public class EstadosolicitudController {
    // POJO de Estadosolicitud Representada.

    private Estadosolicitud estadosolicitud = null;
    // Lista de Estadosolicitud      
    private List<Estadosolicitud> estadosolicituds = null;
    // Transacción del usuario.
    @Resource
    private UserTransaction utx = null;
    // Administrador de la Persistencia de los Estadosolicitud.
    // Relaciona al Controlador con el Modelo (MVC) 
    @PersistenceUnit(unitName = "sistemaReservaPU")
    private EntityManagerFactory emf = null;

    /**
     * Getter del Administrador de Entidades.
     * @return EntityManager
     */
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }
    // ---------- Variables para paginar en el jsp -------------
    public int batchSize = 100;
    private int firstItem = 0;
    private int itemCount = -1;

    /**
     * Setter de la coleccion de Solicitudreserva
     * @param solicitudreservaCollection coleccion de Solicitudreserva
     */
    public void setSolicitudreservaCollectionOfEstadosolicitud(Solicitudreserva[] solicitudreservaCollection) {
        List<Solicitudreserva> solicitudreservaCollectionList = Arrays.asList(solicitudreservaCollection);
        estadosolicitud.setSolicitudreservaCollection(solicitudreservaCollectionList);
    }

    /**
     * Getter del devolucion del estado de recurso
     * @return colleccion de Devolucion
     */
    public Solicitudreserva[] getSolicitudreservaCollectionOfEstadosolicitud() {
        Collection<Solicitudreserva> solicitudreservaCollection = estadosolicitud.getSolicitudreservaCollection();
        if (solicitudreservaCollection == null) {
            return new Solicitudreserva[0];
        }
        return solicitudreservaCollection.toArray(new Solicitudreserva[0]);
    }

    /**
     * Setter de la coleccion de Solicitudusuario
     * @param solicitudusuarioCollection coleccion de Solicitudusuario
     */
    public void setSolicitudusuarioCollectionOfEstadosolicitud(Solicitudusuario[] solicitudusuarioCollection) {
        List<Solicitudusuario> solicitudusuarioCollectionList = Arrays.asList(solicitudusuarioCollection);
        estadosolicitud.setSolicitudusuarioCollection(solicitudusuarioCollectionList);
    }

    /**
     * Getter del devolucion del estado de recurso
     * @return colleccion de Devolucion
     */
    public Solicitudusuario[] getSolicitudusuarioCollectionOfEstadosolicitud() {
        Collection<Solicitudusuario> solicitudusuarioCollection = estadosolicitud.getSolicitudusuarioCollection();
        if (solicitudusuarioCollection == null) {
            return new Solicitudusuario[0];
        }
        return solicitudusuarioCollection.toArray(new Solicitudusuario[0]);
    }

    /**
     * Metodo para obtener una lista de los Estadosrecurso's disponibles de varias selecciones
     * @return lista de Estadosrecurso
     */
    public SelectItem[] getEstadosolicitudsAvailableSelectMany() {
        return getEstadosolicitudsAvailable(false);
    }

    /**
     * Metodo publico para obtener una lista de los Estadosrecurso's disponibles de una sola seleccion
     * @return lista de Estadosrecurso
     */
    public SelectItem[] getEstadosolicitudsAvailableSelectOne() {
        return getEstadosolicitudsAvailable(true);
    }

    /**
     * Metodo privado para obtener una lista de los Estadosrecurso disponibles de una sola seleccion
     * @return lista de Estadosrecurso
     */
    private SelectItem[] getEstadosolicitudsAvailable(boolean one) {
        List<Estadosolicitud> allEstadosolicituds = getEstadosolicituds(true);
        int size = one ? allEstadosolicituds.size() + 1 : allEstadosolicituds.size();
        SelectItem[] items = new SelectItem[size];
        int i = 0;
        if (one) {
            items[0] = new SelectItem("", "---");
            i++;
        }
        for (Estadosolicitud x : allEstadosolicituds) {
            items[i++] = new SelectItem(x, x.toString());
        }
        return items;
    }

    /**
     * Metodo para obtener el objeto Estadosolicitud del Request
     * @return el objeto Estadosolicitud obtenido
     */
    public Estadosolicitud getEstadosolicitud() {
        if (estadosolicitud == null) {
            estadosolicitud = getEstadosolicitudFromRequest();
        }
        if (estadosolicitud == null) {
            estadosolicitud = new Estadosolicitud();
        }
        return estadosolicitud;
    }

    /**
     * Metodo para resetear los valores de inicio y llamar al Tag de Lista de Estadosolicitud
     * @return el tag de la Lista de Estadosolicitud
     */
    public String listSetup() {
        reset(true);
        return "estadosolicitud_list";
    }

    /**
     * Metodo para inicializar los valores del Objeto Estadosolicitud para un nuevo objeto
     * @return el Tag del JSP para crear una nueva entrada de Estadosolicitud
     */
    public String createSetup() {
        reset(false);
        estadosolicitud = new Estadosolicitud();
        return "estadosolicitud_create";
    }

    /**
     * Metodo publico para crear una nueva entrada de Estadosolicitud
     * @return el Tag del siguiente JSP a desplegar
     */
    public String create() {
        if (estadosolicitud.getSolicitudreservaCollection() == null) {
            estadosolicitud.setSolicitudreservaCollection(new ArrayList<Solicitudreserva>());
        }
        if (estadosolicitud.getSolicitudusuarioCollection() == null) {
            estadosolicitud.setSolicitudusuarioCollection(new ArrayList<Solicitudusuario>());
        }
        EntityManager em = getEntityManager();
        try {
            utx.begin();
            List<Solicitudreserva> attachedSolicitudreservaCollection = new ArrayList<Solicitudreserva>();
            for (Solicitudreserva solicitudreservaCollectionSolicitudreservaToAttach : estadosolicitud.getSolicitudreservaCollection()) {
                solicitudreservaCollectionSolicitudreservaToAttach = em.getReference(solicitudreservaCollectionSolicitudreservaToAttach.getClass(), solicitudreservaCollectionSolicitudreservaToAttach.getIdSolicitudReserva());
                attachedSolicitudreservaCollection.add(solicitudreservaCollectionSolicitudreservaToAttach);
            }
            estadosolicitud.setSolicitudreservaCollection(attachedSolicitudreservaCollection);
            List<Solicitudusuario> attachedSolicitudusuarioCollection = new ArrayList<Solicitudusuario>();
            for (Solicitudusuario solicitudusuarioCollectionSolicitudusuarioToAttach : estadosolicitud.getSolicitudusuarioCollection()) {
                solicitudusuarioCollectionSolicitudusuarioToAttach = em.getReference(solicitudusuarioCollectionSolicitudusuarioToAttach.getClass(), solicitudusuarioCollectionSolicitudusuarioToAttach.getIdsolicitudusuario());
                attachedSolicitudusuarioCollection.add(solicitudusuarioCollectionSolicitudusuarioToAttach);
            }
            estadosolicitud.setSolicitudusuarioCollection(attachedSolicitudusuarioCollection);
            em.persist(estadosolicitud);
            for (Solicitudreserva solicitudreservaCollectionSolicitudreserva : estadosolicitud.getSolicitudreservaCollection()) {
                Estadosolicitud oldIdEstadoSolicitudOfSolicitudreservaCollectionSolicitudreserva = solicitudreservaCollectionSolicitudreserva.getIdEstadoSolicitud();
                solicitudreservaCollectionSolicitudreserva.setIdEstadoSolicitud(estadosolicitud);
                solicitudreservaCollectionSolicitudreserva = em.merge(solicitudreservaCollectionSolicitudreserva);
                if (oldIdEstadoSolicitudOfSolicitudreservaCollectionSolicitudreserva != null) {
                    oldIdEstadoSolicitudOfSolicitudreservaCollectionSolicitudreserva.getSolicitudreservaCollection().remove(solicitudreservaCollectionSolicitudreserva);
                    oldIdEstadoSolicitudOfSolicitudreservaCollectionSolicitudreserva = em.merge(oldIdEstadoSolicitudOfSolicitudreservaCollectionSolicitudreserva);
                }
            }
            for (Solicitudusuario solicitudusuarioCollectionSolicitudusuario : estadosolicitud.getSolicitudusuarioCollection()) {
                Estadosolicitud oldIdEstadoSolicitudOfSolicitudusuarioCollectionSolicitudusuario = solicitudusuarioCollectionSolicitudusuario.getIdEstadoSolicitud();
                solicitudusuarioCollectionSolicitudusuario.setIdEstadoSolicitud(estadosolicitud);
                solicitudusuarioCollectionSolicitudusuario = em.merge(solicitudusuarioCollectionSolicitudusuario);
                if (oldIdEstadoSolicitudOfSolicitudusuarioCollectionSolicitudusuario != null) {
                    oldIdEstadoSolicitudOfSolicitudusuarioCollectionSolicitudusuario.getSolicitudusuarioCollection().remove(solicitudusuarioCollectionSolicitudusuario);
                    oldIdEstadoSolicitudOfSolicitudusuarioCollectionSolicitudusuario = em.merge(oldIdEstadoSolicitudOfSolicitudusuarioCollectionSolicitudusuario);
                }
            }
            utx.commit();
            addSuccessMessage("Estadosolicitud was successfully created.");
        } catch (Exception ex) {
            try {
                if (findEstadosolicitud(estadosolicitud.getIdEstadoSolicitud()) != null) {
                    addErrorMessage("Estadosolicitud " + estadosolicitud + " already exists.");
                } else {
                    ensureAddErrorMessage(ex, "A persistence error occurred.");
                }
                utx.rollback();
            } catch (Exception e) {
                ensureAddErrorMessage(e, "An error occurred attempting to roll back the transaction.");
            }
            return null;
        } finally {
            em.close();
        }
        return listSetup();
    }

    /**
     * Funcion de Navegacion a la Pagina Detail.jsp de los Objetos Estadosolicitud
     * @return String
     */
    public String detailSetup() {
        return scalarSetup("estadosolicitud_detail");
    }

    /**
     * Funcion de Navegacion a la Pagina Edicion de los Estadosolicitud's
     * @return String
     */
    public String editSetup() {
        return scalarSetup("estadosolicitud_edit");
    }
    /*
     * Función de Navegación General, controla si existe la ruta de
     * navegación.
     */

    private String scalarSetup(String destination) {
        reset(false);
        estadosolicitud = getEstadosolicitudFromRequest();
        if (estadosolicitud == null) {
            String requestEstadosolicitudString = getRequestParameter("jsfcrud.currentEstadosolicitud");
            addErrorMessage("The estadosolicitud with id " + requestEstadosolicitudString + " no longer exists.");
            String relatedControllerOutcome = relatedControllerOutcome();
            if (relatedControllerOutcome != null) {
                return relatedControllerOutcome;
            }
            return listSetup();
        }
        return destination;
    }
    /**
     * Función publica que procesa los cambios realizados sobre los
     * Estadosolicitud's Representados.
     * @return String
     */

    public String edit() {
        EstadosolicitudConverter converter = new EstadosolicitudConverter();
        String estadosolicitudString = converter.getAsString(FacesContext.getCurrentInstance(), null, estadosolicitud);
        String currentEstadosolicitudString = getRequestParameter("jsfcrud.currentEstadosolicitud");
        if (estadosolicitudString == null || estadosolicitudString.length() == 0 || !estadosolicitudString.equals(currentEstadosolicitudString)) {
            String outcome = editSetup();
            if ("estadosolicitud_edit".equals(outcome)) {
                addErrorMessage("Could not edit estadosolicitud. Try again.");
            }
            return outcome;
        }
        EntityManager em = getEntityManager();
        try {
            utx.begin();
            Estadosolicitud persistentEstadosolicitud = em.find(Estadosolicitud.class, estadosolicitud.getIdEstadoSolicitud());
            Collection<Solicitudreserva> solicitudreservaCollectionOld = persistentEstadosolicitud.getSolicitudreservaCollection();
            Collection<Solicitudreserva> solicitudreservaCollectionNew = estadosolicitud.getSolicitudreservaCollection();
            Collection<Solicitudusuario> solicitudusuarioCollectionOld = persistentEstadosolicitud.getSolicitudusuarioCollection();
            Collection<Solicitudusuario> solicitudusuarioCollectionNew = estadosolicitud.getSolicitudusuarioCollection();
            List<Solicitudreserva> attachedSolicitudreservaCollectionNew = new ArrayList<Solicitudreserva>();
            for (Solicitudreserva solicitudreservaCollectionNewSolicitudreservaToAttach : solicitudreservaCollectionNew) {
                solicitudreservaCollectionNewSolicitudreservaToAttach = em.getReference(solicitudreservaCollectionNewSolicitudreservaToAttach.getClass(), solicitudreservaCollectionNewSolicitudreservaToAttach.getIdSolicitudReserva());
                attachedSolicitudreservaCollectionNew.add(solicitudreservaCollectionNewSolicitudreservaToAttach);
            }
            solicitudreservaCollectionNew = attachedSolicitudreservaCollectionNew;
            estadosolicitud.setSolicitudreservaCollection(solicitudreservaCollectionNew);
            List<Solicitudusuario> attachedSolicitudusuarioCollectionNew = new ArrayList<Solicitudusuario>();
            for (Solicitudusuario solicitudusuarioCollectionNewSolicitudusuarioToAttach : solicitudusuarioCollectionNew) {
                solicitudusuarioCollectionNewSolicitudusuarioToAttach = em.getReference(solicitudusuarioCollectionNewSolicitudusuarioToAttach.getClass(), solicitudusuarioCollectionNewSolicitudusuarioToAttach.getIdsolicitudusuario());
                attachedSolicitudusuarioCollectionNew.add(solicitudusuarioCollectionNewSolicitudusuarioToAttach);
            }
            solicitudusuarioCollectionNew = attachedSolicitudusuarioCollectionNew;
            estadosolicitud.setSolicitudusuarioCollection(solicitudusuarioCollectionNew);
            estadosolicitud = em.merge(estadosolicitud);
            for (Solicitudreserva solicitudreservaCollectionOldSolicitudreserva : solicitudreservaCollectionOld) {
                if (!solicitudreservaCollectionNew.contains(solicitudreservaCollectionOldSolicitudreserva)) {
                    solicitudreservaCollectionOldSolicitudreserva.setIdEstadoSolicitud(null);
                    solicitudreservaCollectionOldSolicitudreserva = em.merge(solicitudreservaCollectionOldSolicitudreserva);
                }
            }
            for (Solicitudreserva solicitudreservaCollectionNewSolicitudreserva : solicitudreservaCollectionNew) {
                if (!solicitudreservaCollectionOld.contains(solicitudreservaCollectionNewSolicitudreserva)) {
                    Estadosolicitud oldIdEstadoSolicitudOfSolicitudreservaCollectionNewSolicitudreserva = solicitudreservaCollectionNewSolicitudreserva.getIdEstadoSolicitud();
                    solicitudreservaCollectionNewSolicitudreserva.setIdEstadoSolicitud(estadosolicitud);
                    solicitudreservaCollectionNewSolicitudreserva = em.merge(solicitudreservaCollectionNewSolicitudreserva);
                    if (oldIdEstadoSolicitudOfSolicitudreservaCollectionNewSolicitudreserva != null && !oldIdEstadoSolicitudOfSolicitudreservaCollectionNewSolicitudreserva.equals(estadosolicitud)) {
                        oldIdEstadoSolicitudOfSolicitudreservaCollectionNewSolicitudreserva.getSolicitudreservaCollection().remove(solicitudreservaCollectionNewSolicitudreserva);
                        oldIdEstadoSolicitudOfSolicitudreservaCollectionNewSolicitudreserva = em.merge(oldIdEstadoSolicitudOfSolicitudreservaCollectionNewSolicitudreserva);
                    }
                }
            }
            for (Solicitudusuario solicitudusuarioCollectionOldSolicitudusuario : solicitudusuarioCollectionOld) {
                if (!solicitudusuarioCollectionNew.contains(solicitudusuarioCollectionOldSolicitudusuario)) {
                    solicitudusuarioCollectionOldSolicitudusuario.setIdEstadoSolicitud(null);
                    solicitudusuarioCollectionOldSolicitudusuario = em.merge(solicitudusuarioCollectionOldSolicitudusuario);
                }
            }
            for (Solicitudusuario solicitudusuarioCollectionNewSolicitudusuario : solicitudusuarioCollectionNew) {
                if (!solicitudusuarioCollectionOld.contains(solicitudusuarioCollectionNewSolicitudusuario)) {
                    Estadosolicitud oldIdEstadoSolicitudOfSolicitudusuarioCollectionNewSolicitudusuario = solicitudusuarioCollectionNewSolicitudusuario.getIdEstadoSolicitud();
                    solicitudusuarioCollectionNewSolicitudusuario.setIdEstadoSolicitud(estadosolicitud);
                    solicitudusuarioCollectionNewSolicitudusuario = em.merge(solicitudusuarioCollectionNewSolicitudusuario);
                    if (oldIdEstadoSolicitudOfSolicitudusuarioCollectionNewSolicitudusuario != null && !oldIdEstadoSolicitudOfSolicitudusuarioCollectionNewSolicitudusuario.equals(estadosolicitud)) {
                        oldIdEstadoSolicitudOfSolicitudusuarioCollectionNewSolicitudusuario.getSolicitudusuarioCollection().remove(solicitudusuarioCollectionNewSolicitudusuario);
                        oldIdEstadoSolicitudOfSolicitudusuarioCollectionNewSolicitudusuario = em.merge(oldIdEstadoSolicitudOfSolicitudusuarioCollectionNewSolicitudusuario);
                    }
                }
            }
            utx.commit();
            addSuccessMessage("Estadosolicitud was successfully updated.");
        } catch (Exception ex) {
            try {
                String msg = ex.getLocalizedMessage();
                if (msg != null && msg.length() > 0) {
                    addErrorMessage(msg);
                } else if (getEstadosolicitudFromRequest() == null) {
                    addErrorMessage("The estadosolicitud with id " + currentEstadosolicitudString + " no longer exists.");
                    utx.rollback();
                    return listSetup();
                } else {
                    addErrorMessage("A persistence error occurred.");
                }
                utx.rollback();
            } catch (Exception e) {
                ensureAddErrorMessage(e, "An error occurred attempting to roll back the transaction.");
            }
            return null;
        } finally {
            em.close();
        }
        return detailSetup();
    }
    /**
     * Funcion que permite la eliminacion de una entrada de Estadosolicitud
     * @return String
     */

    public String destroy() {
        estadosolicitud = getEstadosolicitudFromRequest();
        if (estadosolicitud == null) {
            String currentEstadosolicitudString = getRequestParameter("jsfcrud.currentEstadosolicitud");
            addErrorMessage("The estadosolicitud with id " + currentEstadosolicitudString + " no longer exists.");
            String relatedControllerOutcome = relatedControllerOutcome();
            if (relatedControllerOutcome != null) {
                return relatedControllerOutcome;
            }
            return listSetup();
        }
        EntityManager em = getEntityManager();
        try {
            utx.begin();
            estadosolicitud = em.getReference(estadosolicitud.getClass(), estadosolicitud.getIdEstadoSolicitud());
            Collection<Solicitudreserva> solicitudreservaCollection = estadosolicitud.getSolicitudreservaCollection();
            for (Solicitudreserva solicitudreservaCollectionSolicitudreserva : solicitudreservaCollection) {
                solicitudreservaCollectionSolicitudreserva.setIdEstadoSolicitud(null);
                solicitudreservaCollectionSolicitudreserva = em.merge(solicitudreservaCollectionSolicitudreserva);
            }
            Collection<Solicitudusuario> solicitudusuarioCollection = estadosolicitud.getSolicitudusuarioCollection();
            for (Solicitudusuario solicitudusuarioCollectionSolicitudusuario : solicitudusuarioCollection) {
                solicitudusuarioCollectionSolicitudusuario.setIdEstadoSolicitud(null);
                solicitudusuarioCollectionSolicitudusuario = em.merge(solicitudusuarioCollectionSolicitudusuario);
            }
            em.remove(estadosolicitud);
            utx.commit();
            addSuccessMessage("Estadosolicitud was successfully deleted.");
        } catch (Exception ex) {
            try {
                ensureAddErrorMessage(ex, "A persistence error occurred.");
                utx.rollback();
            } catch (Exception e) {
                ensureAddErrorMessage(e, "An error occurred attempting to roll back the transaction.");
            }
            return null;
        } finally {
            em.close();
        }
        String relatedControllerOutcome = relatedControllerOutcome();
        if (relatedControllerOutcome != null) {
            return relatedControllerOutcome;
        }
        return listSetup();
    }
    /*
     * Función privada para obtener el Objeto Estadosolicitud del Request.
     */

    private Estadosolicitud getEstadosolicitudFromRequest() {
        String theId = getRequestParameter("jsfcrud.currentEstadosolicitud");
        return (Estadosolicitud) new EstadosolicitudConverter().getAsObject(FacesContext.getCurrentInstance(), null, theId);
    }
    /*
     * Función para obtener un valor del request.
     */

    private String getRequestParameter(String key) {
        return FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(key);
    }
    /**
     * Getter de Estadosolicitud (atributo local).
     * @return List<Estadosolicitud>
     */

    public List<Estadosolicitud> getEstadosolicituds() {
        if (estadosolicituds == null) {
            estadosolicituds = getEstadosolicituds(false);
        }
        return estadosolicituds;
    }
    /**
     * Getter de todos los Estadorecruso's (de la Base de Datos)
     * @param all
     * @return List<Estadosolicitud>
     */

    public List<Estadosolicitud> getEstadosolicituds(boolean all) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Estadosolicitud as o");
            if (!all) {
                q.setMaxResults(batchSize);
                q.setFirstResult(getFirstItem());
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }
    /*
     *-------------------------------------------------------------------
     * Funciones de manejo de Mensajes y Errores.
     *-------------------------------------------------------------------
     */
    // Asegura que se almacenen los errores

    private void ensureAddErrorMessage(Exception ex, String defaultMsg) {
        String msg = ex.getLocalizedMessage();
        if (msg != null && msg.length() > 0) {
            addErrorMessage(msg);
        } else {
            addErrorMessage(defaultMsg);
        }
    }
    /**
     * Agrega mensajes de Error para la Página.
     * @param msg El mensaje a ser agregado a la pagina
     */

    public static void addErrorMessage(String msg) {
        FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg);
        FacesContext.getCurrentInstance().addMessage(null, facesMsg);
    }
    /**
     * Agrega mensajes de éxito para la Página.
     * @param msg El mensaje a ser agregado a la pagina
     */

    public static void addSuccessMessage(String msg) {
        FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg);
        FacesContext.getCurrentInstance().addMessage("successInfo", facesMsg);
    }
    /**
     * Obtiene un Objeto Estadosolicitud con el id correspondiente.
     * @param id tipo idEstadosolicitud
     * @return Objeto Estadosolicitud
     */

    public Estadosolicitud findEstadosolicitud(Integer id) {
        EntityManager em = getEntityManager();
        try {
            Estadosolicitud o = (Estadosolicitud) em.find(Estadosolicitud.class, id);
            return o;
        } finally {
            em.close();
        }
    }
    /**
     * Obtiene la cantidad de items de la Estadosolicitud
     * @return La cantidad de items
     */

    public int getItemCount() {
        if (itemCount == -1) {
            EntityManager em = getEntityManager();
            try {
                itemCount = ((Long) em.createQuery("select count(o) from Estadosolicitud as o").getSingleResult()).intValue();
            } finally {
                em.close();
            }
        }
        return itemCount;
    }
    /**
     * Obtiene el primer item de la Estadosolicitud
     * @return El primer item
     */

    public int getFirstItem() {
        getItemCount();
        if (firstItem >= itemCount) {
            if (itemCount == 0) {
                firstItem = 0;
            } else {
                int zeroBasedItemCount = itemCount - 1;
                double pageDouble = zeroBasedItemCount / batchSize;
                int page = (int) Math.floor(pageDouble);
                firstItem = page * batchSize;
            }
        }
        return firstItem;
    }
    /**
     * Obtiene el ultimo item de la Estadosolicitud
     * @return El ultimo item
     */

    public int getLastItem() {
        getFirstItem();
        return firstItem + batchSize > itemCount ? itemCount : firstItem + batchSize;
    }
    /**
     * Obtiene tamaño del buffer para desplegar la lista
     * @return El tamaño del buffer
     */

    public int getBatchSize() {
        return batchSize;
    }
    /**
     * Obtiene la siguiente coleccion de items de Estadosolicitud
     * conforme al BatchSize
     * @return La siguiente coleccion de items
     */

    public String next() {
        reset(false);
        getFirstItem();
        if (firstItem + batchSize < itemCount) {
            firstItem += batchSize;
        }
        return "estadosolicitud_list";
    }
    /**
     * Obtiene la anterior coleccion de items de Estadosolicitud
     * conforme al BatchSize
     * @return La anterior coleccion de items
     */

    public String prev() {
        reset(false);
        getFirstItem();
        firstItem -= batchSize;
        if (firstItem < 0) {
            firstItem = 0;
        }
        return "estadosolicitud_list";
    }

    private String relatedControllerOutcome() {
        String relatedControllerString = getRequestParameter("jsfcrud.relatedController");
        String relatedControllerTypeString = getRequestParameter("jsfcrud.relatedControllerType");
        if (relatedControllerString != null && relatedControllerTypeString != null) {
            FacesContext context = FacesContext.getCurrentInstance();
            Object relatedController = context.getApplication().getELResolver().getValue(context.getELContext(), null, relatedControllerString);
            try {
                Class<?> relatedControllerType = Class.forName(relatedControllerTypeString);
                Method detailSetupMethod = relatedControllerType.getMethod("detailSetup");
                return (String) detailSetupMethod.invoke(relatedController);
            } catch (ClassNotFoundException e) {
                throw new FacesException(e);
            } catch (NoSuchMethodException e) {
                throw new FacesException(e);
            } catch (IllegalAccessException e) {
                throw new FacesException(e);
            } catch (InvocationTargetException e) {
                throw new FacesException(e);
            }
        }
        return null;
    }

    private void reset(boolean resetFirstItem) {
        estadosolicitud = null;
        estadosolicituds = null;
        itemCount = -1;
        if (resetFirstItem) {
            firstItem = 0;
        }
    }
    private Map<Object, String> asString = null;
    /**
     * Obtiene el mapeo del objeto actual en su representacion String
     * @return Mapeo de <code>Object, String</code>
     */

    public Map<Object, String> getAsString() {
        if (asString == null) {
            asString = new HashMap<Object, String>() {

                @Override
                public String get(Object key) {
                    if (key instanceof Object[]) {
                        Object[] keyAsArray = (Object[]) key;
                        if (keyAsArray.length == 0) {
                            return "(No Items)";
                        }
                        StringBuffer sb = new StringBuffer();
                        for (int i = 0; i < keyAsArray.length; i++) {
                            if (i > 0) {
                                sb.append("<br />");
                            }
                            sb.append(keyAsArray[i]);
                        }
                        return sb.toString();
                    }
                    return new EstadosolicitudConverter().getAsString(FacesContext.getCurrentInstance(), null, (Estadosolicitud) key);
                }
            };
        }
        return asString;
    }
    /**
     * Función que Vincula y Valida JSP con la Estadosolicitud representada.
     * @param facesContext El contexto del faces
     * @param component
     * @param value
     */

    public void validateCreate(FacesContext facesContext, UIComponent component, Object value) {
        EstadosolicitudConverter converter = new EstadosolicitudConverter();
        String newEstadosolicitudString = converter.getAsString(FacesContext.getCurrentInstance(), null, new Estadosolicitud());
        String estadosolicitudString = converter.getAsString(FacesContext.getCurrentInstance(), null, estadosolicitud);
        if (!newEstadosolicitudString.equals(estadosolicitudString)) {
            createSetup();
        }
    }
}
